package main

import (
	"fmt"
	"sync"
)

//上例使用信道的方法，在单个协程或者协程数少的时候，并不会有什么问题，但在协程数多的时候，代码就会显得非常复杂
//更优雅的方式，是使用waitGroup
//waitGroup里面有个计数器。 Add()方法可以让计数器增加，Done()方法可以让计数器减少。
//Wait方法，会阻塞，直到计数器归零时

//注意第二个参数，传入的是waitGroup实例的指针
func worker(x int, wg *sync.WaitGroup) {
	//当某个子协程完成后，可调用此方法，会从计数器上减一，通常可以使用 defer 来调用。
	defer wg.Done()
	for i := 0; i < 5; i++ {
		fmt.Printf("worker: %d , i:%d \n", x, i)
	}
}

func main() {
	var wg sync.WaitGroup //实例化 waitGroup

	wg.Add(2)         //初始值为0，传入多少，计数器就增加多少。这里直接传入协程的数量
	go worker(1, &wg) //注意传的是指针
	go worker(2, &wg)

	//阻塞当前协程，直到实例里的计数器归零
	wg.Wait()
}
